package common;

import java.lang.reflect.Method;

import org.springframework.aop.ThrowsAdvice;

import util.LogUtil;

public class ExceptionHandler implements ThrowsAdvice {

	/*
	 * 如果记录信息和被拦截方法要在不同事务中执行，分别提交，那么将自己的拦截器设在spring事务管理器拦截器的外面；
	 * 如果需要将记录信息和被拦截方法在同一个事务中处理，必须将自己的拦截器被包围在spring事务管理拦截器中，
	 * 并且记录信息方法的事务传播属性为默认的REQUIRED。
	 * 
	 * 如果你记录信息的方法需要单独的一个事务环境，那就把事务传播属性设为REQUIRES_NEW，这样spring事务管理器会新建一个事务，
	 * 并且新建一个session连接，因为一个数据库连接不可能同时有两个事务，记录信息完了提交事务并且把新建的session连接关闭，
	 * 自己的拦截器退出后继续执行被拦截的方法或它的事务处理
	 */

	public void afterThrowing(Method method, Object[] args, Object target, RuntimeException e) {
		System.out.println("产生异常的方法名称：  " + method.getName());

		for (Object o : args) {
			System.out.println("方法的参数：   " + o.toString());
		}

		System.out.println("代理对象：   " + target.getClass().getName());
		System.out.println("抛出的异常:    " + e.getMessage() + ">>>>>>>" + e.getCause());
		System.out.println("异常详细信息：　　　" + e.fillInStackTrace());
	}

	// public void afterThrowing(BadSqlGrammarException e) {
	// System.out.println("数据访问异常:BadSqlGrammarException");
	// System.out.println("============================");
	// System.out.println(e.getLocalizedMessage());
	// System.out.println("============================");
	// }
	//
	// public void afterThrowing(InvalidResultSetAccessException e) {
	// System.out.println("数据访问异常:InvalidResultSetAccessException");
	// System.out.println("============================");
	// System.out.println(e.getLocalizedMessage());
	// System.out.println("============================");
	// }
	//
	// public void afterThrowing(DuplicateKeyException e) {
	// System.out.println("数据访问异常:DuplicateKeyException");
	// System.out.println("============================");
	// System.out.println(e.getLocalizedMessage());
	// System.out.println("============================");
	// }
	//
	// public void afterThrowing(DataIntegrityViolationException e) {
	// System.out.println("数据访问异常:DataIntegrityViolationException");
	// System.out.println("============================");
	// System.out.println(e.getLocalizedMessage());
	// System.out.println("============================");
	// }
	//
	// public void afterThrowing(PermissionDeniedDataAccessException e) {
	// System.out.println("数据访问异常:PermissionDeniedDataAccessException");
	// System.out.println("============================");
	// System.out.println(e.getLocalizedMessage());
	// System.out.println("============================");
	// }
	//
	// public void afterThrowing(DataAccessResourceFailureException e) {
	// System.out.println("数据访问异常:DataAccessResourceFailureException");
	// System.out.println("============================");
	// System.out.println(e.getLocalizedMessage());
	// System.out.println("============================");
	// }
	//
	// public void afterThrowing(TransientDataAccessResourceException e) {
	// System.out.println("数据访问异常:TransientDataAccessResourceException");
	// System.out.println("============================");
	// System.out.println(e.getLocalizedMessage());
	// System.out.println("============================");
	// }
	//
	// public void afterThrowing(CannotAcquireLockException e) {
	// System.out.println("数据访问异常:CannotAcquireLockException");
	// System.out.println("============================");
	// System.out.println(e.getLocalizedMessage());
	// System.out.println("============================");
	// }
	//
	// public void afterThrowing(DeadlockLoserDataAccessException e) {
	// System.out.println("数据访问异常:DeadlockLoserDataAccessException");
	// System.out.println("============================");
	// System.out.println(e.getLocalizedMessage());
	// System.out.println("============================");
	// }
	//
	// public void afterThrowing(CannotSerializeTransactionException e) {
	// System.out.println("数据访问异常:CannotSerializeTransactionException");
	// System.out.println("============================");
	// System.out.println(e.getLocalizedMessage());
	// System.out.println("============================");
	// }

}